package com.Exception异常.try_catch;

import com.简单项目.自己写的房屋出租.P;

/**
 * 作    者 ：吾路巴尼
 * 创建时间 ：2025/2/18-0:59
 */
public class try_catch_finally_Detail01 {
    /**
     * 1.如果try中有一行代码抛出错误，在异常处的下面的代码不会执行直接跳到catch块中执行
     * 2.反之，如果try中没有抛出错误，则try中的代码块会全部执行完，不会执行catch块中的代码
     * 3.如果不管是否发生异常 都希望 执行某段代码比如(关闭连接,释放资源)等则使用finally代码块
     * 4.如果try代码块中有多个异常，可以使用不同的catch块捕获不同的异常类型，要求子类异常写在父类异常之前；
     * 因为Exception写在前面他会捕获所有的异常，后面写单独的就没有意义，报错；
     * 5.try-finally 代码块：相当于没有捕获异常，try代码块有异常后执行完finally直接崩溃，finally相当于善后操作，例如崩溃前关闭资源，保存数据等；
     */
    public static void main(String[] args) {
        /**1.如果try中有一行代码抛出错误，在异常处的下面的代码不会执行直接跳到catch块中执行*/
        try {
            System.out.println("try");
            int n = 10 / 0;
            System.out.println("上一行异常不会再执行try代码块");
        } catch (Exception e) {
            System.out.println("异常信息 = " + e.getMessage());
        }
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
        /**2.反之，如果try中没有抛出错误，则try中的代码块会全部执行完，不会执行catch块中的代码*/
        try {
            System.out.println("try");
            System.out.println("try执行完不会到catch代码块，因为try没有异常");
        } catch (Exception e) {
            System.out.println("异常信息 = " + e.getMessage());
        }

        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

        /**3.如果不管是否发生异常 都希望 执行某段代码比如(关闭连接,释放资源)等则使用finally代码块*/
        try {
            System.out.println("try");
        } catch (Exception e) {
            System.out.println("异常信息 = " + e.getMessage());
        } finally {
            System.out.println("finally代码块中的代码会执行");
        }

        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

        /**4.如果try代码块中有多个异常，可以使用不同的catch块捕获不同的异常类型（只会捕获一种异常，当发生异常时后面的代码就不会继续执行），
         * 要求子类异常写在父类异常之前；因为Exception写在前面他会捕获所有的异常，后面写单独的就没有意义，报错*/
        try {
            P p = new P();
            p = null;
            p.Add();  // 如果时空指针异常,我们用NullPointerException捕获

            int n = 10 / 0;  // 如果算术异常，我们用ArithmeticException捕获
        }catch (NullPointerException e){
            System.out.println("空指针异常 = " + e.getMessage());// 如果时空指针异常,我们用NullPointerException捕获
        }catch (ArithmeticException e){
            System.out.println("算术异常 = " + e.getMessage());// 如果算术异常，我们用ArithmeticException捕获
        }catch (Exception e){
            System.out.println("其他异常 = " + e.getMessage());//如果都不是上面捕获的，我们用Exception捕获；
        }

        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

        /** 5.try-finally 代码块：相当于没有捕获异常，try代码块有异常后执行完finally直接崩溃，finally相当于善后操作，例如崩溃前关闭资源，保存数据等；*/
        try {
            System.out.println("try");
            System.out.println(10 / 0);// 这里会抛出异常,但是finally代码块仍然会执行
        }finally {
            System.out.println("无论try有没有异常都执行finally");
        }
        System.out.println("因为没有catch代码块捕获处理，执行完finally就会崩溃，下面就不会执行了，这句话也不会输出！!!");
    }
}
